const fs = require('fs').promises; // 改用异步 IO 模块（fs.promises）
const path = require('path');
const logger = require('../logger')

class LauncherConfig {
    constructor(configDir) {
        // 保持原有核心配置字段不变
        this.deviceIndex = 0;
        this.lastDeviceIndex = 0;
        this.port = 8989;
        this.logLevel = 'info';
        this.autoDetect = true;

        this.configPath = path.join(configDir, 'launcher_config.json');
        // 新增：打印配置文件路径,便于排查
        logger.debug(`Launcher配置文件路径: ${this.configPath}`);
    }

    /**
     * 改造为：异步加载配置（返回 Promise）
     * - 成功：resolve（无论文件是否新建,都返回加载后的配置状态）
     * - 失败：内部捕获错误,用默认值兜底,仍 resolve（避免单个配置失败阻塞整体）
     */
    async load() { // 关键：加 async,变为异步方法
        try {
            // 异步判断文件是否存在（替代 fs.existsSync,用 try/catch 捕获 "文件不存在" 错误）
            await fs.access(this.configPath);

            // 异步读取文件（替代 fs.readFileSync）
            const data = await fs.readFile(this.configPath, 'utf8');
            const config = JSON.parse(data);

            // 验证配置结构（逻辑不变）
            if (typeof config.launcher !== 'object') {
                throw new Error('配置文件格式错误,缺少 launcher 字段或类型不正确');
            }

            // 逐个字段赋值（逻辑不变）
            this.deviceIndex = config.launcher.deviceIndex ?? this.deviceIndex;
            this.lastDeviceIndex = config.launcher.lastDeviceIndex ?? this.lastDeviceIndex;
            this.port = config.launcher.port ?? this.port;
            this.logLevel = config.launcher.logLevel ?? this.logLevel;
            this.autoDetect = config.launcher.autoDetect ?? this.autoDetect;

            logger.info('✅ Launcher配置加载完成');
        } catch (err) {
            // 分情况处理错误：文件不存在 → 新建默认配置；其他错误 → 用默认值
            if (err.code === 'ENOENT') { // ENOENT = 文件不存在
                const defaultConfig = {
                    launcher: {
                        deviceIndex: this.deviceIndex,
                        lastDeviceIndex: this.lastDeviceIndex,
                        port: this.port,
                        logLevel: this.logLevel,
                        autoDetect: this.autoDetect
                    },
                    last_updated: new Date().toISOString()
                };
                // 异步写入默认配置（替代 fs.writeFileSync）
                await fs.writeFile(this.configPath, JSON.stringify(defaultConfig, null, 4));
                logger.info('✅ Launcher配置文件不存在,已创建默认配置');
            } else {
                // 其他错误（如JSON解析失败）→ 用默认值兜底
                const errMsg = err?.message || "未知错误";
                logger.error('⚠️ Launcher配置加载失败,使用默认配置:', errMsg);
                throw err
            }
        }
    }

    /**
     * 可选：同步 save 改异步（保持和 load 风格一致）
     */
    async save() { // 加 async,变为异步方法
        try {
            const config = {
                launcher: {
                    deviceIndex: this.deviceIndex,
                    lastDeviceIndex: this.lastDeviceIndex,
                    port: this.port,
                    logLevel: this.logLevel,
                    autoDetect: this.autoDetect
                },
                last_updated: new Date().toISOString()
            };
            await fs.writeFile(this.configPath, JSON.stringify(config, null, 4)); // 异步写入
            logger.info('✅ Launcher配置已保存');
        } catch (err) {
            logger.error('⚠️ Launcher配置保存失败:', err.message);
        }
    }

    // 以下 updateXXX、toggleXXX、getConfig 方法完全不变（和 IO 无关）
    updateDeviceIndex(index) {
        this.lastDeviceIndex = this.deviceIndex;
        this.deviceIndex = index;
    }

    updatePort(port) {
        this.port = port;
    }

    updateLogLevel(level) {
        this.logLevel = level;
    }

    toggleAutoDetect(enabled) {
        this.autoDetect = enabled;
    }

    getConfig() {
        return {
            deviceIndex: this.deviceIndex,
            lastDeviceIndex: this.lastDeviceIndex,
            port: this.port,
            logLevel: this.logLevel,
            autoDetect: this.autoDetect
        };
    }
}

module.exports = LauncherConfig;